###Install packages *** ###Load libraries

library(raster)
Loading required package: sp
library(tidyverse)
── Attaching packages ───────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.1.0     ✔ purrr   0.2.5
✔ tibble  2.0.0     ✔ dplyr   0.7.8
✔ tidyr   0.8.2     ✔ stringr 1.3.1
✔ readr   1.3.1     ✔ forcats 0.3.0
package ‘tibble’ was built under R version 3.5.2── Conflicts ──────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ tidyr::extract() masks raster::extract()
✖ dplyr::filter()  masks stats::filter()
✖ dplyr::lag()     masks stats::lag()
✖ dplyr::select()  masks raster::select()
library(ggthemes)
library(patchwork)
library(maptools)
Checking rgeos availability: TRUE
library(ggmap)
Google Maps API Terms of Service: http://developers.google.com/maps/terms.
Please cite ggmap if you use it: see citation("ggmap") for details.
library(marmap)

Attaching package: ‘marmap’

The following object is masked from ‘package:raster’:

    as.raster

The following object is masked from ‘package:grDevices’:

    as.raster

###Part 1: Outline maps

usa <- map_data(map="state")

Attaching package: ‘maps’

The following object is masked from ‘package:purrr’:

    map
us_missouri <- map_data(map="state",
                        region="missouri")
us_other <- subset(x=usa,
                   subset=region %in% c("alabama",
                                        "florida",
                                        "mississippi",
                                        "north carolina"))
str(usa)
'data.frame':   15537 obs. of  6 variables:
 $ long     : num  -87.5 -87.5 -87.5 -87.5 -87.6 ...
 $ lat      : num  30.4 30.4 30.4 30.3 30.3 ...
 $ group    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ order    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ region   : chr  "alabama" "alabama" "alabama" "alabama" ...
 $ subregion: chr  NA NA NA NA ...
ggplot()+
  geom_polygon(data=us_other,
               aes(x=long,
                   y=lat,
                   group=group),
               fill = "gray")

ggplot()+
  geom_polygon(data = us_other,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="gray")+
  geom_polygon(data=us_missouri,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="black")

ggplot()+
  geom_polygon(data = us_other,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="gray")+
  geom_polygon(data=us_missouri,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="black")+
  geom_polygon(data = usa,
               aes(x=long,
                   y=lat,
                   group=group),
               fill=NA,
               color="black")

us_map <- ggplot()+
  geom_polygon(data = us_other,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="gray")+
  geom_polygon(data=us_missouri,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="black")+
  geom_polygon(data=usa,
               aes(x=long,
                   y=lat,
                   group=group),
               fill=NA,
               color="black")+
  theme_map()+
  coord_fixed(1.3)
us_map

#Missouri map

missouri <- map_data("county", "missouri")
mo_scott <- subset(missouri, subregion %in% c("scott"))
mo_map <- ggplot()+
  geom_polygon(data=missouri, aes(x=long, y=lat, group=group), fill=NA, color="black")+
  geom_polygon(data=mo_scott, aes(x=long, y=lat, group=group), fill="black")+
  theme_map()+
  coord_fixed(1.3)
mo_map

us_map + mo_map + plot_layout(ncol = 2, widths = c(1.5, 1))

#Outline Maps #This should be interesting… I was born in Hawaii. It isn’t part of the map_data, so I’ll choose Utah, where I lived for two years and learned to ski. I lived in Ogden in Weber county. My initials are AKC. The counties I chose to put in gray are Kane and Carbon.

us_utah <- map_data(map="state",
                      region = "utah")
utah <- map_data("county", "utah")
ut_birth <- subset(utah, subregion %in% c("weber"))
ut_names <- subset(utah, subregion %in% c("carbon", "kane"))

akc_usa <- ggplot()+
  geom_polygon(data = us_utah,
               aes(x = long,
               y = lat,
               group = group),
               fill = "black")+
  geom_polygon(data = usa,
               aes(x = long,
               y = lat,
               group = group),
               fill = NA,
               color = "black")+
  theme_map()+
  coord_fixed(1.3)

akc_counties <- ggplot()+
  geom_polygon(data = ut_birth,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = "black")+
  geom_polygon(data = ut_names,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = "gray")+
  geom_polygon(data = utah,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = NA,
               color = "black")+
  theme_map()+
  coord_fixed(1.3)

akc_usa + akc_counties + plot_layout(ncol = 2, widths = c(1.5,1))

#The Hawaii Gambit… Born on Oahu, and have visited Hawaii (the big island) and Maui. I’ll see if I can get that to work. I love working with maps.

hawaii <- map_data("world", "USA:Hawaii")
hawaii_oahu <- map_data("world", "USA:Hawaii:Oahu")
other_islands <- map_data("world", c("USA:Hawaii:Hawaii", "USA:Hawaii:Maui"))

akc_usa <- ggplot()+
  geom_polygon(data = us_utah,
               aes(x = long,
               y = lat,
               group = group),
               fill = "black")+
  geom_polygon(data = usa,
               aes(x = long,
               y = lat,
               group = group),
               fill = NA,
               color = "black")+
  theme_map()+
  coord_fixed(1.3)

akc_hawaii <- ggplot()+
  geom_polygon(data = hawaii,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = NA,
               color = "black")+
  geom_polygon(data = hawaii_oahu,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = "black")+
  geom_polygon(data = other_islands,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = "gray")+
  theme_map()+
  coord_fixed(1.3)
akc_usa + akc_hawaii + plot_layout(ncol = 2, widths = c(1.5, 1))

#Hmm. The big island of Hawaii didn’t show up as gray. I guess the name in map_data is different. The code is there that would select it. On to Part 2!


###Part 2: Dot distribution maps ###Load the libraries #already loaded ###Define some variables. set.seed value as in assignment so I can see if I’m doing it right!

min_long <- -126
max_long <- -104
min_lat <- 31
max_lat <- 50

set.seed(9618973)
file_path <-"~/Documents/BI685Files/GitHubDocs/chronister_andrew/data"

###Read in the “Gigantopithecus” data

bigfoot <- read.csv(file.path(file_path, "bigfoot.csv"))

bigfoot <- filter(bigfoot,
                  long >= min_long & long <= max_long,
                  lat >= min_lat & lat <= max_lat) %>%
  sample_n(300) %>%
  mutate(name = "Gigantiopithecus") %>%
  select(name, long, lat)

#Read in the bears data

bears <- read_csv(file.path(file_path, "bears.csv"))
Parsed with column specification:
cols(
  name = col_character(),
  long = col_double(),
  lat = col_double()
)
both_species <- bind_rows(bigfoot, bears)

head(both_species)
tail(both_species)

#Get terrain map

base = get_stamenmap(bbox = c(min_long,
                              min_lat,
                              max_long,
                              max_lat),
                     zoom = 4,
                     maptype = "terrain-background")
ggmap(base)

base <- ggmap(base)

base + geom_point(data = bigfoot,
                  aes(x = long,
                      y = lat))

base + geom_point(data = bears,
                  aes(x = long,
                  y = lat))

#Both species

base + geom_point(data = both_species,
                  aes(x = long,
                      y = lat,
                      shape = name,
                      fill = name),
                  size = 2)+
  scale_shape_manual(values = c(22:23))+
  labs(x = "Longitude",
       y = "Latitude",
       fill = "Species",
       shape = "Species")


###Recreate with SO number as seed

LS0tCnRpdGxlOiAiSFcxMDogTWFwcyIKYXV0aG9yOiAiQW5kcmV3IENocm9uaXN0ZXIiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCICVZJylgIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgoqKioKIyMjSW5zdGFsbCBwYWNrYWdlcwoqKioKIyMjTG9hZCBsaWJyYXJpZXMKYGBge3J9CmxpYnJhcnkocmFzdGVyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkobWFwdG9vbHMpCmxpYnJhcnkoZ2dtYXApCmxpYnJhcnkobWFybWFwKQpgYGAKKioqCiMjI1BhcnQgMTogT3V0bGluZSBtYXBzCmBgYHtyfQp1c2EgPC0gbWFwX2RhdGEobWFwPSJzdGF0ZSIpCnVzX21pc3NvdXJpIDwtIG1hcF9kYXRhKG1hcD0ic3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICByZWdpb249Im1pc3NvdXJpIikKdXNfb3RoZXIgPC0gc3Vic2V0KHg9dXNhLAogICAgICAgICAgICAgICAgICAgc3Vic2V0PXJlZ2lvbiAlaW4lIGMoImFsYWJhbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb3JpZGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pc3Npc3NpcHBpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3J0aCBjYXJvbGluYSIpKQpgYGAKCmBgYHtyfQpzdHIodXNhKQpgYGAKYGBge3J9CmdncGxvdCgpKwogIGdlb21fcG9seWdvbihkYXRhPXVzX290aGVyLAogICAgICAgICAgICAgICBhZXMoeD1sb25nLAogICAgICAgICAgICAgICAgICAgeT1sYXQsCiAgICAgICAgICAgICAgICAgICBncm91cD1ncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSAiZ3JheSIpCmBgYAoKYGBge3J9CmdncGxvdCgpKwogIGdlb21fcG9seWdvbihkYXRhID0gdXNfb3RoZXIsCiAgICAgICAgICAgICAgIGFlcyh4PWxvbmcsCiAgICAgICAgICAgICAgICAgICB5PWxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwPWdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbD0iZ3JheSIpKwogIGdlb21fcG9seWdvbihkYXRhPXVzX21pc3NvdXJpLAogICAgICAgICAgICAgICBhZXMoeD1sb25nLAogICAgICAgICAgICAgICAgICAgeT1sYXQsCiAgICAgICAgICAgICAgICAgICBncm91cD1ncm91cCksCiAgICAgICAgICAgICAgIGZpbGw9ImJsYWNrIikKYGBgCgpgYGB7cn0KZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c19vdGhlciwKICAgICAgICAgICAgICAgYWVzKHg9bG9uZywKICAgICAgICAgICAgICAgICAgIHk9bGF0LAogICAgICAgICAgICAgICAgICAgZ3JvdXA9Z3JvdXApLAogICAgICAgICAgICAgICBmaWxsPSJncmF5IikrCiAgZ2VvbV9wb2x5Z29uKGRhdGE9dXNfbWlzc291cmksCiAgICAgICAgICAgICAgIGFlcyh4PWxvbmcsCiAgICAgICAgICAgICAgICAgICB5PWxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwPWdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbD0iYmxhY2siKSsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzYSwKICAgICAgICAgICAgICAgYWVzKHg9bG9uZywKICAgICAgICAgICAgICAgICAgIHk9bGF0LAogICAgICAgICAgICAgICAgICAgZ3JvdXA9Z3JvdXApLAogICAgICAgICAgICAgICBmaWxsPU5BLAogICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siKQpgYGAKCmBgYHtyfQp1c19tYXAgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c19vdGhlciwKICAgICAgICAgICAgICAgYWVzKHg9bG9uZywKICAgICAgICAgICAgICAgICAgIHk9bGF0LAogICAgICAgICAgICAgICAgICAgZ3JvdXA9Z3JvdXApLAogICAgICAgICAgICAgICBmaWxsPSJncmF5IikrCiAgZ2VvbV9wb2x5Z29uKGRhdGE9dXNfbWlzc291cmksCiAgICAgICAgICAgICAgIGFlcyh4PWxvbmcsCiAgICAgICAgICAgICAgICAgICB5PWxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwPWdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbD0iYmxhY2siKSsKICBnZW9tX3BvbHlnb24oZGF0YT11c2EsCiAgICAgICAgICAgICAgIGFlcyh4PWxvbmcsCiAgICAgICAgICAgICAgICAgICB5PWxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwPWdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbD1OQSwKICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIikrCiAgdGhlbWVfbWFwKCkrCiAgY29vcmRfZml4ZWQoMS4zKQp1c19tYXAKYGBgCiNNaXNzb3VyaSBtYXAgCmBgYHtyfQptaXNzb3VyaSA8LSBtYXBfZGF0YSgiY291bnR5IiwgIm1pc3NvdXJpIikKbW9fc2NvdHQgPC0gc3Vic2V0KG1pc3NvdXJpLCBzdWJyZWdpb24gJWluJSBjKCJzY290dCIpKQptb19tYXAgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGE9bWlzc291cmksIGFlcyh4PWxvbmcsIHk9bGF0LCBncm91cD1ncm91cCksIGZpbGw9TkEsIGNvbG9yPSJibGFjayIpKwogIGdlb21fcG9seWdvbihkYXRhPW1vX3Njb3R0LCBhZXMoeD1sb25nLCB5PWxhdCwgZ3JvdXA9Z3JvdXApLCBmaWxsPSJibGFjayIpKwogIHRoZW1lX21hcCgpKwogIGNvb3JkX2ZpeGVkKDEuMykKbW9fbWFwCmBgYAoKYGBge3J9CnVzX21hcCArIG1vX21hcCArIHBsb3RfbGF5b3V0KG5jb2wgPSAyLCB3aWR0aHMgPSBjKDEuNSwgMSkpCmBgYAojT3V0bGluZSBNYXBzCiNUaGlzIHNob3VsZCBiZSBpbnRlcmVzdGluZy4uLiBJIHdhcyBib3JuIGluIEhhd2FpaS4gSXQgaXNuJ3QgcGFydCBvZiB0aGUgbWFwX2RhdGEsIHNvIEknbGwgY2hvb3NlIFV0YWgsIHdoZXJlIEkgbGl2ZWQgZm9yIHR3byB5ZWFycyBhbmQgbGVhcm5lZCB0byBza2kuICBJIGxpdmVkIGluIE9nZGVuIGluIFdlYmVyIGNvdW50eS4gIE15IGluaXRpYWxzIGFyZSBBS0MuIFRoZSBjb3VudGllcyBJIGNob3NlIHRvIHB1dCBpbiBncmF5IGFyZSBLYW5lIGFuZCBDYXJib24uICAgCmBgYHtyfQp1c191dGFoIDwtIG1hcF9kYXRhKG1hcD0ic3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID0gInV0YWgiKQp1dGFoIDwtIG1hcF9kYXRhKCJjb3VudHkiLCAidXRhaCIpCnV0X2JpcnRoIDwtIHN1YnNldCh1dGFoLCBzdWJyZWdpb24gJWluJSBjKCJ3ZWJlciIpKQp1dF9uYW1lcyA8LSBzdWJzZXQodXRhaCwgc3VicmVnaW9uICVpbiUgYygiY2FyYm9uIiwgImthbmUiKSkKCmFrY191c2EgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c191dGFoLAogICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c2EsCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSwKICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSsKICB0aGVtZV9tYXAoKSsKICBjb29yZF9maXhlZCgxLjMpCgpha2NfY291bnRpZXMgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1dF9iaXJ0aCwKICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1dF9uYW1lcywKICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImdyYXkiKSsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHV0YWgsCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9IE5BLAogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKwogIHRoZW1lX21hcCgpKwogIGNvb3JkX2ZpeGVkKDEuMykKCmFrY191c2EgKyBha2NfY291bnRpZXMgKyBwbG90X2xheW91dChuY29sID0gMiwgd2lkdGhzID0gYygxLjUsMSkpCmBgYAojVGhlIEhhd2FpaSBHYW1iaXQuLi4gQm9ybiBvbiBPYWh1LCBhbmQgaGF2ZSB2aXNpdGVkIEhhd2FpaSAodGhlIGJpZyBpc2xhbmQpIGFuZCBNYXVpLiBJJ2xsIHNlZSBpZiBJIGNhbiBnZXQgdGhhdCB0byB3b3JrLiAgSSBsb3ZlIHdvcmtpbmcgd2l0aCBtYXBzLiAgICAKYGBge3J9Cmhhd2FpaSA8LSBtYXBfZGF0YSgid29ybGQiLCAiVVNBOkhhd2FpaSIpCmhhd2FpaV9vYWh1IDwtIG1hcF9kYXRhKCJ3b3JsZCIsICJVU0E6SGF3YWlpOk9haHUiKQpvdGhlcl9pc2xhbmRzIDwtIG1hcF9kYXRhKCJ3b3JsZCIsIGMoIlVTQTpIYXdhaWk6SGF3YWlpIiwgIlVTQTpIYXdhaWk6TWF1aSIpKQoKYWtjX3VzYSA8LSBnZ3Bsb3QoKSsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzX3V0YWgsCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSAiYmxhY2siKSsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzYSwKICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9IE5BLAogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKwogIHRoZW1lX21hcCgpKwogIGNvb3JkX2ZpeGVkKDEuMykKCmFrY19oYXdhaWkgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBoYXdhaWksCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9IE5BLAogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKwogIGdlb21fcG9seWdvbihkYXRhID0gaGF3YWlpX29haHUsCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9ICJibGFjayIpKwogIGdlb21fcG9seWdvbihkYXRhID0gb3RoZXJfaXNsYW5kcywKICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImdyYXkiKSsKICB0aGVtZV9tYXAoKSsKICBjb29yZF9maXhlZCgxLjMpCmFrY191c2EgKyBha2NfaGF3YWlpICsgcGxvdF9sYXlvdXQobmNvbCA9IDIsIHdpZHRocyA9IGMoMS41LCAxKSkKYGBgCiNIbW0uICBUaGUgYmlnIGlzbGFuZCBvZiBIYXdhaWkgZGlkbid0IHNob3cgdXAgYXMgZ3JheS4gIEkgZ3Vlc3MgdGhlIG5hbWUgaW4gbWFwX2RhdGEgaXMgZGlmZmVyZW50LiAgVGhlIGNvZGUgaXMgdGhlcmUgdGhhdCB3b3VsZCBzZWxlY3QgaXQuICBPbiB0byBQYXJ0IDIhCgoqKioKIyMjUGFydCAyOiBEb3QgZGlzdHJpYnV0aW9uIG1hcHMKKioqCiMjI0xvYWQgdGhlIGxpYnJhcmllcyAKI2FscmVhZHkgbG9hZGVkCioqKgojIyNEZWZpbmUgc29tZSB2YXJpYWJsZXMuIHNldC5zZWVkIHZhbHVlIGFzIGluIGFzc2lnbm1lbnQgc28gSSBjYW4gc2VlIGlmIEknbSBkb2luZyBpdCByaWdodCEgCmBgYHtyfQptaW5fbG9uZyA8LSAtMTI2Cm1heF9sb25nIDwtIC0xMDQKbWluX2xhdCA8LSAzMQptYXhfbGF0IDwtIDUwCgpzZXQuc2VlZCg5NjE4OTczKQpmaWxlX3BhdGggPC0ifi9Eb2N1bWVudHMvQkk2ODVGaWxlcy9HaXRIdWJEb2NzL2Nocm9uaXN0ZXJfYW5kcmV3L2RhdGEiCmBgYAoKKioqCiMjI1JlYWQgaW4gdGhlICJHaWdhbnRvcGl0aGVjdXMiIGRhdGEKYGBge3J9CmJpZ2Zvb3QgPC0gcmVhZC5jc3YoZmlsZS5wYXRoKGZpbGVfcGF0aCwgImJpZ2Zvb3QuY3N2IikpCgpiaWdmb290IDwtIGZpbHRlcihiaWdmb290LAogICAgICAgICAgICAgICAgICBsb25nID49IG1pbl9sb25nICYgbG9uZyA8PSBtYXhfbG9uZywKICAgICAgICAgICAgICAgICAgbGF0ID49IG1pbl9sYXQgJiBsYXQgPD0gbWF4X2xhdCkgJT4lCiAgc2FtcGxlX24oMzAwKSAlPiUKICBtdXRhdGUobmFtZSA9ICJHaWdhbnRpb3BpdGhlY3VzIikgJT4lCiAgc2VsZWN0KG5hbWUsIGxvbmcsIGxhdCkKYGBgCiNSZWFkIGluIHRoZSBiZWFycyBkYXRhCmBgYHtyfQpiZWFycyA8LSByZWFkX2NzdihmaWxlLnBhdGgoZmlsZV9wYXRoLCAiYmVhcnMuY3N2IikpCgpib3RoX3NwZWNpZXMgPC0gYmluZF9yb3dzKGJpZ2Zvb3QsIGJlYXJzKQoKaGVhZChib3RoX3NwZWNpZXMpCmBgYApgYGB7cn0KdGFpbChib3RoX3NwZWNpZXMpCmBgYAojR2V0IHRlcnJhaW4gbWFwCmBgYHtyfQpiYXNlID0gZ2V0X3N0YW1lbm1hcChiYm94ID0gYyhtaW5fbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2xhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sYXQpLAogICAgICAgICAgICAgICAgICAgICB6b29tID0gNCwKICAgICAgICAgICAgICAgICAgICAgbWFwdHlwZSA9ICJ0ZXJyYWluLWJhY2tncm91bmQiKQpnZ21hcChiYXNlKQpgYGAKYGBge3J9CmJhc2UgPC0gZ2dtYXAoYmFzZSkKCmJhc2UgKyBnZW9tX3BvaW50KGRhdGEgPSBiaWdmb290LAogICAgICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICB5ID0gbGF0KSkKYGBgCmBgYHtyfQpiYXNlICsgZ2VvbV9wb2ludChkYXRhID0gYmVhcnMsCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgeSA9IGxhdCkpCmBgYAojQm90aCBzcGVjaWVzCmBgYHtyfQpiYXNlICsgZ2VvbV9wb2ludChkYXRhID0gYm90aF9zcGVjaWVzLAogICAgICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IG5hbWUpLAogICAgICAgICAgICAgICAgICBzaXplID0gMikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMjI6MjMpKSsKICBsYWJzKHggPSAiTG9uZ2l0dWRlIiwKICAgICAgIHkgPSAiTGF0aXR1ZGUiLAogICAgICAgZmlsbCA9ICJTcGVjaWVzIiwKICAgICAgIHNoYXBlID0gIlNwZWNpZXMiKQpgYGAKKioqCiMjI1JlY3JlYXRlIHdpdGggU08gbnVtYmVyIGFzIHNlZWQKCgoK